学习 co
co 是使用 ES6 generator 的必然会引用到的第三方库,它很好的解决了 yield 表达式返回值的问题,通过自动的不断调用 .next 使得函数向下执行。
1 | var co = require('co'); |
上面是一个 co 的使用范例。它接受一个 generator 函数作为参数,返回一个 Promise 对象,将 generator 函数的执行结果作为 resolve 的参数,通过调用 then 方法,将结果打印到控制台。
co 的源码很短,不过 200 来行(注释计算在内了),如果我们只按照上面的例子调用 co,co 可以简化为如下代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20module.exports = simpleCo;
function simpleCo(gen) {
var ctx = this;
return new Promise(function(resolve, reject) {
gen = gen.call(ctx);
fulNext();
function fulNext(res) {
try {
var ret = gen.next(res);
if (!ret.done) {
fulNext(ret.value);
} else {
resolve(ret.value);
}
} catch ( e ) {
reject(e);
}
}
});
}
20 行足矣,源码见 github。